package org.tis.tools.abf.module.ac.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import org.tis.tools.abf.module.ac.controller.request.AcMenuFilterRequest;
import org.tis.tools.abf.module.ac.entity.AcMenu;
import org.tis.tools.abf.module.ac.entity.vo.AcMenuApiDetail;
import org.tis.tools.abf.module.ac.entity.vo.AcMenuDetail;
import org.tis.tools.abf.module.ac.entity.vo.AcMenuUiEntityDetail;
import org.tis.tools.abf.module.ac.exception.AcMenuManagementException;

import java.math.BigDecimal;
import java.util.List;

/**
 * acMenu的Service接口类
 * 
 * @author Auto Generate Tools
 * @date 2018/04/23
 */
public interface IAcMenuService extends IService<AcMenu>  {
    /**
     * 菜单移动
     *
     * @param targetGuid  目标菜单GUID
     * @param moveGuid   移动的菜单GUID
     * @param order 排序
     * @exception AcMenuManagementException
     */
    AcMenu moveMenu(String targetGuid, String moveGuid, BigDecimal order)throws AcMenuManagementException;

    /**
     * 删除父菜单及其子菜单
     * @param menuGuid  父菜单GUID
     * @return List<AcMenu> 所有子菜单值
     * @exception AcMenuManagementException
     */
    AcMenu deleteAllSubAcMenu(String menuGuid) throws AcMenuManagementException;

    /**
     * 修改菜单
     * @param acMenu  修改菜单对象
     * @return 修改结果
     * @exception AcMenuManagementException
     */
    AcMenu updateAcMenu(AcMenu acMenu) throws AcMenuManagementException;

    /**
     * 新增子菜单
     * @param acMenu  新增菜单对象
     * @return 新增结果
     * @exception AcMenuManagementException
     */
    AcMenu createChildMenu(AcMenu acMenu) throws AcMenuManagementException;

    /**
     * 新增根菜单
     * @param acMenu  新增菜单对象
     * @return 新增结果
     * @exception AcMenuManagementException
     */
    AcMenu createRootMenu(AcMenu acMenu) throws AcMenuManagementException;

    /**
     * 查询应用下根菜单
     * @param GUID_APP  新增菜单对象
     * @return 新增结果
     * @exception AcMenuManagementException
     */
    List<AcMenuUiEntityDetail> queryRootMenu(String GUID_APP) throws AcMenuManagementException;

    /**
     * 过滤查询应用下菜单数据
     */
    AcMenuDetail queryAcMenuFilterLists(AcMenuFilterRequest acMenuFilterRequest) throws AcMenuManagementException;

    /**
     * <p>
     * 根据 id 条件，查询该菜单的下一级所有的子菜单
     * </p>
     *
     * @param gidParents  菜单Gid
     * @return List<AcMenu> 所有子菜单值
     * @exception AcMenuManagementException
     */
    List<AcMenuUiEntityDetail> selectSubMenu(String gidParents)throws AcMenuManagementException;

    /**
     * 根据 id,和name 条件，查询该菜单的下一级所有的子菜单
     * @param guidParents
     * @param name
     * @return
     * @throws AcMenuManagementException
     */
    List<AcMenuUiEntityDetail> getSubMenuFilter(String guidParents, String name)throws AcMenuManagementException;

    /**
     * 重新排序菜单下的子菜单
     *
     * @param identityGuid 目标菜单GUID
     * @param index 起始位置
     * @param flag 自增或自减
     */
    void reorderMenu(String identityGuid, BigDecimal index ,String flag);

    /**
     * 根据GUID查询菜单
     */
    AcMenuUiEntityDetail getDetail(String guid)throws AcMenuManagementException;

    /**
     * 分页查询菜单
     */
    Page<AcMenuUiEntityDetail> getPage(Page<AcMenu> page, EntityWrapper<AcMenu> wrapper)throws AcMenuManagementException;

    /**
     * 对外服务提供接口
     * 查询应用下的菜单
     *
     * @param appId 应用GUID
     * @return 应用菜单的树结构
     * @throws AcMenuManagementException 菜单异常处理
     */
    AcMenuApiDetail getMenusByApp(String appId) throws AcMenuManagementException;

    /**
     * 对外服务提供接口
     * 根据应用和操作员获取菜单
     *
     * @param appId 应用GUID
     * @param operatorId 操作员GUID
     * @return 应用菜单的树结构
     * @throws AcMenuManagementException 菜单异常处理
     */
    AcMenuApiDetail getMenusInAppOperator(String appId, String operatorId) throws AcMenuManagementException;
}

